package city.spring.modules.consumptionItem.service;

import city.spring.modules.consumptionItem.entity.ConsumptionCategoryEntity;
import city.spring.modules.consumptionItem.vo.ConsumptionCategoryEntityVO;
import com.baomidou.mybatisplus.core.conditions.Wrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.Constants;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.IService;
import org.apache.ibatis.annotations.Param;

import java.util.List;

/**
 * Service：收费项目类别
 *
 * @author pxm
 * @date 2020-08-05 16:19:31
 */
public interface ConsumptionCategoryService extends IService<ConsumptionCategoryEntity> {
    String CACHE_NAME = "consumption_category";

    /**
     * 业务处理：保存一个 <strong>收费项目类别</strong>
     *
     * @param entity 收费项目类别
     */
    void saveConsumptionCategory(ConsumptionCategoryEntity entity);

    /**
     * 业务处理：修改一个 <strong>收费项目类别</strong>
     *
     * @param entity 收费项目类别
     */
    void updateConsumptionCategory(ConsumptionCategoryEntity entity);

    /**
     * 业务处理：删除一个 <strong>收费项目类别</strong>
     *
     * @param primaryKey 主键ID
     */
    void deleteConsumptionCategory(String primaryKey);

    /**
     * 业务处理：删除多个 <strong>收费项目类别</strong>
     *
     * @param primaryKeys 主键ID列表
     */
    void deleteConsumptionCategory(List<String> primaryKeys);

    /**
     * 把原始数据列表转换成树形结构数据
     *
     * @param rawDatasource    原始数据列表
     * @param loadParentEntity 是否加载父级信息：如果处理后的顶级结果中依旧存在父级标识，是否继续加载结果列表中父级信息，建议传入 true ，在搜索的时候有时候只能搜索出子节点，此时可以加载出父节点西悉尼
     * @return 从原始数据列表中转换成树形结构数据
     */
    List<ConsumptionCategoryEntity> converterToTreeDatasource(List<ConsumptionCategoryEntity> rawDatasource, boolean loadParentEntity);

    /**
     * 把原始数据列表转换成树形结构数据
     *
     * @param rawDatasource 原始数据列表
     * @return 从原始数据列表中转换成树形结构数据
     */
    default List<ConsumptionCategoryEntity> converterToTreeDatasource(List<ConsumptionCategoryEntity> rawDatasource) {
        return converterToTreeDatasource(rawDatasource, true);
    }

    /**
     * 获取 pid为null的 消费项目类别 列表展示（子类别）
     *
     * @return
     */
    List<ConsumptionCategoryEntity> getLittleCategory();

    /**
     * 获取 pid不为null的 消费项目类别 列表展示（父类别）
     *
     * @return
     */
    List<ConsumptionCategoryEntity> getFatherCategory();


    /**
     * 分页获取的消费类别
     *
     * @param page    分页对象
     * @param wrapper 查询对象
     * @return 消费类别
     */
    IPage<ConsumptionCategoryEntityVO> listPage(Page<? extends ConsumptionCategoryEntity> page, @Param(Constants.WRAPPER) Wrapper<? extends ConsumptionCategoryEntity> wrapper);

    ConsumptionCategoryEntity getConsumptionCategoryById(String id);
}